package com.atguigu.lease.admin.interceptor;

import com.atguigu.lease.common.util.JwtUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component //自定义拦截器
// 验证登录状态：  获取请求头中的token 存在 并且解析没有异常 表示token有效
public class WebAdminAuthInterceptor implements HandlerInterceptor {
    public static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new ThreadLocal<>();
    // 使用线程对象为键 为这个线程共享数据，只要是这个线程调用的方法 都可以使用当前线程 获取共享数据
    //    拦截器的属性 是多线程的共享变量，所以需要考虑线程安全 已经并发访问的压力！
    //    static final Map<Thread , Map<String,Object>> MAP = new ConcurrentHashMap<>();
    //handler方法调用前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("preHandle zhixingle....");
        //1、获取请求头中的token
        String token = request.getHeader("ACCESS_TOKEN");
        //2、解析: 如果没有异常 登录状态有效
        Map<String, Object> userInfo = JwtUtil.parseJwt(token);
        //userInfo表示 从jwt中解析到的用户信息
        // 将userInfo 透传给handler方法： handler方法 和拦截器的方法是同一个线程调用的
        // 方法1：   Thread.currentThread() 都可以获取到 同一个线程对象
        // 方法2： ThreadLocal
        THREAD_LOCAL.set(userInfo);// thread.threadLocalMap.put(THREAD_LOCAL ,userInfo )
        //3、放行请求： 返回true表示放行请求
        return true;
    }
    //handler方法调用完 视图渲染完毕调用
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        System.out.println("afterCompletion zhixingle....");
        //收尾操作： 为了防止内存泄露(使用完的数据 依然有变量持有他们的引用 导致GC时无法回收)
        THREAD_LOCAL.remove();
    }
}
